home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / date.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  2KB  |  114 lines

  1. /* date - print or set time and date        Author: Jan Looyen */
  2.  
  3. #include <sys/types.h>
  4. #include <stddef.h>
  5. #include <time.h>
  6. #include <stdio.h>
  7.  
  8. #define    MIN    60L        /* # seconds in a minute */
  9. #define    HOUR    (60 * MIN)    /* # seconds in an hour */
  10. #define    DAY    (24 * HOUR)    /* # seconds in a day */
  11. #define    YEAR    (365 * DAY)    /* # seconds in a year */
  12.  
  13. main(argc, argv)
  14. int argc;
  15. char **argv;
  16. {
  17.   int qflag;
  18.   long t;
  19.   char time_buf[15];
  20.  
  21.   if (argc > 2) usage();
  22.   if (argc == 2) {
  23.     if (*argv[1] == '-' && (argv[1][1] | 0x60) == 'q') {
  24.         freopen("/dev/tty0", "r", stdin);
  25.         printf("\nPlease enter date: MMDDYYhhmmss. Then hit the RETURN key.\n");
  26.         gets(time_buf);
  27.         set_time(time_buf);
  28.     } else
  29.         set_time(argv[1]);
  30.   }
  31.   time(&t);
  32.   printf("%s", ctime(&t));
  33.   exit(0);
  34. }
  35.  
  36.  
  37. set_time(t)
  38. char *t;
  39. {
  40.   char *tp;
  41.   long ct;
  42.   int len;
  43.   static int days_per_month[] = {
  44.               31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  45.   };
  46.   struct tm *p;
  47.  
  48.   time(&ct);
  49.   p = localtime(&ct);
  50.   p->tm_year -= 70;
  51.   p->tm_mon++;
  52.   len = strlen(t);
  53.   if (len != 12 && len != 10 && len != 6 && len != 4) usage();
  54.   tp = t;
  55.   while (*tp)
  56.     if (!isdigit(*tp++)) bad();
  57.   if (len == 6 || len == 12) p->tm_sec = conv(&tp, 59);
  58.   p->tm_min = conv(&tp, 59);
  59.   p->tm_hour = conv(&tp, 23);
  60.   if (len == 12 || len == 10) {
  61.     p->tm_year = conv(&tp, 99);
  62.     p->tm_mday = conv(&tp, 31);
  63.     p->tm_mon = conv(&tp, 12);
  64.     p->tm_year -= 70;
  65.     if (p->tm_year < 0) p->tm_year += 100;
  66.   }
  67.   ct = p->tm_year * YEAR;
  68.   ct += ((p->tm_year + 1) / 4) * DAY;
  69.   days_per_month[1] = 28;
  70.   if (((p->tm_year + 2) % 4) == 0) days_per_month[1]++;
  71.   len = 0;
  72.   p->tm_mon--;
  73.   while (len < p->tm_mon) ct += days_per_month[len++] * DAY;
  74.   ct += --p->tm_mday * DAY;
  75.   ct += p->tm_hour * HOUR;
  76.   ct += p->tm_min * MIN;
  77.   ct += p->tm_sec;
  78.   if (stime(&ct)) fprintf(stderr, "Set date not allowed\n");
  79. }
  80.  
  81. conv(ptr, max)
  82. char **ptr;
  83. int max;
  84. {
  85.   int buf;
  86.  
  87.   *ptr -= 2;
  88.   buf = atoi(*ptr);
  89.   **ptr = 0;
  90.   if (buf < 0 || buf > max) bad();
  91.   return(buf);
  92. }
  93.  
  94. bad()
  95. {
  96.   fprintf(stderr, "Date: bad conversion\n");
  97.   exit(1);
  98. }
  99.  
  100. usage()
  101. {
  102.   fprintf(stderr, "Usage: date [-q] [[MMDDYY]hhmm[ss]]\n");
  103.   exit(1);
  104. }
  105.  
  106. isdigit(c)
  107. char c;
  108. {
  109.   if (c >= '0' && c <= '9')
  110.     return(1);
  111.   else
  112.     return(0);
  113. }
  114.